reformulação de mac...
 
Notifications
Clear all

reformulação de macro

33 Posts
4 Usuários
0 Reactions
3,650 Visualizações
(@juliowd)
Posts: 0
New Member
Topic starter
 

Olá! Eu estou desenvolvendo uma planilha que já está funcionando. Porém funciona lenta. Muito lenta. E desconfio de uma programação específica.
Então eu gostaria da ajuda de vocês aqui do fórum com uma macro que seja mais rápida. Vou passar a macro que desconfio ser o problema.

'macro para deletar as linhas que contiverem "..."
For linha = 1000 To 6 Step -1
If ThisWorkbook.ActiveSheet.Range("t" & linha) = "..." Then
ThisWorkbook.ActiveSheet.Rows(linha).Delete
End If
Next linha

Agradeço a ajuda!!!
Um abraço.

 
Postado : 05/08/2014 3:01 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, os segundos não medi. Mas vou fazer amanhã certinho a medida e posto aqui. Mas foi significante. Me parece que com a tua, levou apenas 1/4 do tempo.

 
Postado : 05/08/2014 7:12 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, medi os segundos. Na versão antigo passou de 2 minutos e 25 segundos para 40 segundos.

 
Postado : 05/08/2014 7:56 pm
(@edcronos)
Posts: 1006
Noble Member
 

somente por desencargo de consciência
se alguem puder apagar o de cima que apaga todas as linhas :? "deve ser o sono"

   Sub Adiciona_Exclui_Linhas_Em_Branco_De_Range_MoveLinhasColunaT2()
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    cr = Cells(1, "T").Column    'coluna de referencia indica a coluna que vai verificar se a Linhas está em branco
    Lf = 2    'Linha inicial da range
    Li = Cells(Rows.Count, cr).End(xlUp).Row    ' ultima linha da range
    tl = 0: kl = 0
    Do
        Li = Li - 1
        If Cells(Li, cr) <> "..." Then
            If tl > 0 Then
                lk = tl - l
                Range(Li + 1 & ":" & Li + lk).Rows.Delete Shift:=xlUp
            End If
            tl = 0
        Else
            tl = tl + 1
        End If
    Loop Until Li = Lf
    Application.Calculation = xlCalculationAutomatic
    Application.ScreenUpdating = True
End Sub

juliowd

desculpe aí pelo transtorno
ainda estou iniciando nisso e basicamente só consigo fazer macro olhando a planilha
ainda não sei se funcionaria na sua planilha

mas o funcionamento da macro é simples
ela conta as Linhas que tem "..."
e quando acha um valor diferente de "..." ela gera uma range com todas as linhas exclui e zera o contador,
mas faz isso dentro do intervalo de 2 valores diferentes
eu fiz para alguem do forum e aproveitei para fazer em modo de ajuste caso alguem precisasse adicionar linhas em branco tbm.

testei com 59 Mil linhas, nesse arranjo

    _S____ T __ U
    19___ 20__ 21
    _____ ...
    19___ 20__ 21
    _____ ...
    [/list:u:3j1owbzh] e "bem, demorou um pouco ,algo em torno de 1 minuto" ,
    mas como falei não sei a estrutura da sua planilha, mas quem sabe pode vim a ser útil um dia, assim como é para mim.

    A do fernando faz uma união de todas as linha que tem esse valor e exclui de uma só vez, (mais uma técnica aprendida :D )

    Att.

     
Postado : 05/08/2014 10:50 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Edcronos, vai acompanhando que sempre tem alguma novidade. Por exemplo, não usei matriz. Se tivesse usado, cairia pra menos de 5 segundos..

Tipo, carrega tudo na matriz e em vez de usar o cells/range pra fazer o teste antes do Union, fazer a leitura pela matriz. O resto é igual. O ganho seria ainda maior.

Julio, q bom q funcionou. Saiba, dava pra melhorar mais, se tiver interesse, amanhã eu mando outro código.

 
Postado : 06/08/2014 1:10 am
(@edcronos)
Posts: 1006
Noble Member
 

Fernando,
valeu aí
eu tenho macro que usa matrizes para esse propósito
mas nunca pensei em usar union para fazer todo o trabalho de uma vez só. "bem, nunca usei union"

uma coisa que não consigo usar é Resize, e ainda não encontrei motivos para ter que usar. "de certa forma tenho traumas a respeito"
fez minha planilha que tinha 16m ficar com 460M e com as formatações condicionais todas bagunçadas (Bem , os valores foram para o lugar certo)

att.

 
Postado : 06/08/2014 1:31 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Da uma olhada aqui:
viewtopic.php?f=28&t=8862

 
Postado : 06/08/2014 11:43 am
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, eu tenho interesse em um novo código sim. Isso porque além deste código que estou aprendendo com você, na mesma macro ela roda mais uma série de outros códigos. E, além disso, muitas outras pessoas vão usar essa planilha em computadores mais lentos. Então quanto mais rápido eu conseguir, melhor ainda. Vai ajudar bastante gente no meu trabalho.

Obrigado!

 
Postado : 06/08/2014 12:24 pm
(@edcronos)
Posts: 1006
Noble Member
 

Fernando,
no caso do comando Resize,
parece que ele faz deslocamento físico de células oq na minha planilha criou milhares de pequenas formatações condicionais.
e isso inflou a planilha.

Hoje em dia não tenho problemas com tamanho nem velocidade.
Como é uma planilha eternamente experimental, qualquer coisa que leve mais tempo que uma Piscada(Literalmente)... Eu Refaço.

Eu já tenho uma macro para dês-formatar e Refazer as formatações condicionais quando a planilha sofre deslocamentos físicos.

a maior descoberta para mim foi as Arrays, essa sim trouxe velocidade.
Acho que o pessoal não usa muito pq dá mais trabalho para trabalhar com os dados e recoloca-los na planilha na posição certa.

att

 
Postado : 06/08/2014 2:07 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Olá. Encontrei esta outra fórmula.
Não consegui testar ainda. Mas pelo código, será que é mais rápida?

Sub apagarlinhas()
Range("c1").Select
While ActiveCell.Value <> ""
If ActiveCell.Value <> "são paulo" Then
ActiveCell.Offset(1, 0).Range("a1").Select
Else
Selection.EntireRow.Delete
End If
Wend
End Sub

 
Postado : 07/08/2014 11:04 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Segue

'macro para deletar as linhas que contiverem "..."
dim rngParaDeletar as Excel.Range
Dim arrParaDeletar as variant

    set rngParaDeletar = activesheet.rows(1001)
    ArrParaDeletar = activesheet.range("a1:t1000").value

    For linha = 1000 To 6 Step -1
        If arrparadeletar(linha, 20) is "..." Then
            SET RNGPARADELETAR = application.union(rngparadeletar,ActiveSheet.Rows(linha))
        End If
    Next linha
    if not rngparadeletar is nothing then
        rngparadeletar.delete shift:=xlup
    endif
 
Postado : 08/08/2014 5:36 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Olá. Encontrei esta outra fórmula.
Não consegui testar ainda. Mas pelo código, será que é mais rápida?

Direto e reto: não perca seu tempo, não é mais rápida.
Motivo: faz a mesma coisa que sua original, mas é pior que ela, pois seleciona as células antes de as ler, se quiser testar vá em frente, vai concluir que estou certo :)

Edcronos, crie um tópico sobre o resize explicando o q houve o q fez, o q rolou q tava (ou ainda tá) ruim...
Tenho boas dicas pra dar sobre o assunto, mas num tópico seu. ;)

 
Postado : 08/08/2014 5:40 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, obrigado mais uma vez. Vou fazer testes com essa nova programação amanhã de manhã. Depois te informo o resultado!!

 
Postado : 08/08/2014 10:55 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Não esqueça de informar o novo tempo...
Ainda tenho alternativa q pode resolver mais rápido, mas envolve outro uso de matriz q não dava pra escrever no bar pelo celular.
Mas acredite, o novo código vai reduzir o tempo em uns 80%....

 
Postado : 09/08/2014 1:28 am
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, a nova programação não rolou. Deu problema, de novo, no NOTHING. Deu erro de compilação. Uso inválido do objeto.
Coloquei o IS na frente, e deu: Erro de compilação. Era esperado expressão.

E agora?
Ah, me deixaste com água na boca com essa fórmula 80% mais rápida!!!!
To aqui babando!!
hehehe

 
Postado : 09/08/2014 6:36 pm
(@juliowd)
Posts: 0
New Member
Topic starter
 

Fernando, alterei ali. Era só trocar o "=" pelo "IS".
E funcionou.
E contei o tempo e ficou praticamente o mesmo.
Se puderes mandar essa fórmula 80% mais rápida........................ quero ver!! heheheheh

 
Postado : 09/08/2014 8:29 pm
Página 2 / 3